package com.shuai.blog.common;

import org.springframework.util.DigestUtils;

import java.util.UUID;

/**
 * 功能：将用户密码进行加盐加密、判断密码是否相同
 */
public class PwdSaltingUtils {
    /**
     * 将用户输入的密码进行随机加盐
     *
     * @param passwordInput 用户输入的密码
     * @return 返回加盐后的密码
     */
    public static String saltingEncrypt(String passwordInput) {
        String saltValue = UUID.randomUUID().toString().replaceAll("-", "");    //得到一个随机的32位盐值
        String saltedPassword = DigestUtils.md5DigestAsHex((passwordInput + saltValue).getBytes());  //将用户输入的密码和随机盐值相加进行MD5进行md5加密
        return saltValue + AppConstant.SEPARATOR + saltedPassword; //生成最后的密码，共65位。我们将salt盐值放在前32位再加上$再加上后32位MD5加密的加盐之后的密码
    }

    /**
     * 拿到用户输入密码加上该用户对应加盐后的密码
     *
     * @param passwordInput 用户输入的明文密码
     * @param saltValue     该用户在数据库中存储的对应盐值
     * @return 返回生成的预期密码
     */
    private static String getExpectPassword(String passwordInput, String saltValue) {
        String saltPassword = passwordInput + saltValue;
        String saltedPassword = DigestUtils.md5DigestAsHex(saltPassword.getBytes());
        return saltValue + AppConstant.SEPARATOR + saltedPassword;
    }

    /**
     * 验证用户输入的密码和数据库中存储的密码是否一致
     *
     * @param passwordInput 用户输入的密码
     * @param finalPassword 最终存储的密码
     * @return 返回比较结果，相同->true。否则->false
     */
    public static boolean verify(String passwordInput, String finalPassword) {
        String saltValue = finalPassword.split(AppConstant.SEPARATOR)[0];
        String confirmPassword = getExpectPassword(passwordInput, saltValue);
        return confirmPassword.equals(finalPassword);
    }

}
